package com.wmh.baseservice.common.redis.mq.core.stream;


import com.wmh.baseservice.common.redis.mq.core.message.RedisMessageBase;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.springframework.data.redis.core.StringRedisTemplate;
import com.wmh.baseservice.common.redis.mq.core.RedisMqTemplate;
import static com.wmh.baseservice.common.redis.mq.core.RedisMqTemplate.STREAM_KEY_LIST;


/**
 * redis stream 消息体基类
 *
 * @author 审心
 */
@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
public abstract class AbstractRedisStreamMessage extends RedisMessageBase {
    public AbstractRedisStreamMessage() {
        /*
         * 当消息被实例化后将 stream key 添加到本地缓存中
         * 代码添加到此处 无论是监听器在配置类添加到容器时 还是实例化消息发送时 都会将stream key 值缓存
         * */
        STREAM_KEY_LIST.add(this.getStreamKey());
    }

    /**
     * 重试次数
     */
    private long retryCount = 0;

    /**
     * 最大重试次数 默认 100 次
     */
    private long maxRetryCount = 100;

    /**
     * 消息最长消费时间 (单位/秒)
     * 超过此消费时间 未 ack 定义为失败
     * 默认 600秒
     */
    private long maxConsumptionTime = 600;

    /**
     * 获取 stream key 值, 默认使用 前缀 + 类名
     * final 防止重写 保持前缀
     *
     * @return key 值
     */
    public final String getStreamKey() {
        return RedisMqTemplate.MQ_STREAM_KEY_PREFIX + this.streamKey();
    }

    /**
     * 重写此方法即可自定义 前缀后的 key 内容
     *
     * @return key 后缀内容
     */
    private String streamKey() {
        return this.getClass().getSimpleName();
    }

    /**
     * 最大队列长度
     *
     * @return 默认 500 个消息
     */
    public long getMaxSize() {
        return 500;
    }


    /**
     * 创建消费组
     * ps: 此方法主要用于 消费者在三方的情况,在服务端限定消费组
     *
     * @param template 操作模版
     * @param group    消费组
     */
    public final void createGroup(StringRedisTemplate template, String group) {
        RedisMqTemplate.createGroup(template, this.getStreamKey(), group);
    }

}
